package com.uoko.plugins.jpush.common;

import cn.jiguang.common.resp.APIConnectionException;
import cn.jiguang.common.resp.APIRequestException;
import cn.jpush.api.push.CIDResult;
import cn.jpush.api.push.PushResult;

import java.util.Map;

/**
 * 极光推送推成集成
 *
 * @author shaohua
 * Email shaohua@uoko.com
 * created by 2018/5/30
 */
public interface JpushSender {

    /**
     * 获取cid 防止重复推送，在推送前调用
     *
     * @param count the count of cid list, from 1 to 1000. default is 1.
     * @param type  default is push, option: schedule
     * @return
     */
    CIDResult getCidList(int count, String type) throws APIConnectionException, APIRequestException;

    /**
     * 广播(broadcast): 向安装该App的所有设备发送消息。(android & ios)
     *
     * @param alert 消息提示内容
     * @return
     * @throws Exception
     */
    PushResult sendAllBroadcast(String alert, String title, String cid,
                                Map<String, String> extras) throws Exception;


    /**
     * 广播(broadcast): 向安装该App的所有设备发送消息。
     *
     * @param alert  提示内容
     * @param title  推送标题
     * @param cid    可选	用于防止 api 调用端重试造成服务端的重复推送而定义的一个标识符。(随机生成uuid)
     * @param extras 可选	通知内容体。是被推送到客户端的内容。与 message 一起二者必须有其一，可以二者并存
     * @return
     * @throws Exception
     */
    PushResult sendAndroidBroadcast(String alert, String title, String cid,
                                    Map<String, String> extras) throws Exception;


    /**
     * Unicast<单播> </>向指定的设备发送消息，包括向单个device_token或者单个alias发消息。
     *
     * @param alert          通知栏提示文字
     * @param title          通知标题
     * @param cid            可选	用于防止 api 调用端重试造成服务端的重复推送而定义的一个标识符。(随机生成uuid)
     * @param extras         通知的内容
     * @param registrationId registrationId推送，device_token
     * @return
     * @throws Exception
     */
    PushResult sendAndroidUnicast(String alert, String title, String cid, Map<String, String> extras,
                                  String... registrationId) throws Exception;


    /**
     * 向满足特定条件的设备集合发送消息，
     * 例如: "特定版本"、"特定地域"等。
     *
     * @param alert  通知栏提示文字
     * @param title  通知标题
     * @param cid    可选	用于防止 api 调用端重试造成服务端的重复推送而定义的一个标识符。(随机生成uuid)
     * @param extras 通知的内容
     * @return
     * @throws Exception
     */
    Map<String, PushResult> sendAndroidGroupcast(String alert, String title, String cid, Map<String, String> extras) throws Exception;


    /**
     * 自定义播(customizedcast): 开发者通过自有的alias进行推送,
     * * 可以针对单个或者一批alias进行推送，也可以将alias存放到文件进行发送。
     *
     * @param alert  通知栏提示文字
     * @param title  通知标题
     * @param cid    可选	用于防止 api 调用端重试造成服务端的重复推送而定义的一个标识符。(随机生成uuid)
     * @param extras 通知的内容
     * @param alias  alias可由开发者自定义
     * @return
     * @throws Exception
     */
    PushResult sendAndroidCustomizedcast(String alert, String title,
                                         String cid, Map<String, String> extras, String... alias) throws Exception;

    /**
     * ios 发送广播
     *
     * @param alert  提示内容
     * @param cid    可选	用于防止 api 调用端重试造成服务端的重复推送而定义的一个标识符。(随机生成uuid)
     * @param extras 通知的内容
     * @return
     * @throws Exception
     */
    PushResult sendIOSBroadcast(String alert, String cid, Map<String, String> extras) throws Exception;


    /**
     * ios 发送广播单个
     *
     * @param alert          提示内容
     * @param cid            可选	用于防止 api 调用端重试造成服务端的重复推送而定义的一个标识符。(随机生成uuid)
     * @param extras         通知的内容
     * @param registrationId ios注册id
     * @return
     * @throws Exception
     */
    PushResult sendIOSUnicast(String alert, Map<String, String> extras, String... registrationId) throws Exception;


    /**
     * 向满足特定条件的设备集合发送消息，
     * 例如: "特定版本"、"特定地域"等。
     *
     * @param alert  通知栏提示文字
     * @param cid    可选	用于防止 api 调用端重试造成服务端的重复推送而定义的一个标识符。(随机生成uuid)
     * @param extras 通知的内容
     * @return
     * @throws Exception
     */
    Map<String, PushResult> sendIOSGroupcast(String alert, String cid, Map<String, String> extras) throws Exception;

    /**
     * 自定义播(customizedcast): 开发者通过自有的alias进行推送,
     * * 可以针对单个或者一批alias进行推送，也可以将alias存放到文件进行发送。
     *
     * @param alert  通知栏提示文字
     * @param cid    可选	用于防止 api 调用端重试造成服务端的重复推送而定义的一个标识符。(随机生成uuid)
     * @param extras 通知的内容
     * @param alias  alias可由开发者自定义
     * @return
     * @throws Exception
     */
    PushResult sendIOSCustomizedcast(String alert,
                                     String cid, Map<String, String> extras, String... alias) throws Exception;

}
